import { Context, h, Schema } from 'koishi';

export const name = 'cube-count';
export const using = ['database'];

declare module 'koishi' {
  interface Tables {
    stats: Stat;
  }
}

interface Stat {
  name: 'cube_count';
  value: number;
}

export interface Config {
  ignoreBotSelf: boolean;
}

export const Config: Schema<Config> = Schema.intersect([

  Schema.object({
    ignoreBotSelf: Schema.boolean()
      .default(true)
      .description('是否忽略机器人自身发送的cube'),
  }).description("基础配置")

])

export function apply(ctx: Context) {
  const cubeLogger = ctx.logger('cube-count');

  // 1. 定义数据库模型
  ctx.model.extend('stats', {
    name: 'string',
    value: 'integer',
  }, {
    primary: 'name',
  });

  // 2. 监听消息事件
  ctx.middleware(async (session, next) => {
    // 确保消息内容存在
    if (!session.content) 
      return next();

    if ( session.userId === session.bot.selfId )
      return next();

    // 检查消息内容是否包含 'cube'，不区分大小写
    if (session.content.toLowerCase().includes('cube')) {
      
      try {
        // 从数据库获取当前的 cube_count 值
        const [stat] = await ctx.database.get('stats', { name: 'cube_count' });
        
        let newValue: number;
        if (stat) {
          // 如果记录已存在，则值加 1
          newValue = stat.value + 1;
          await ctx.database.set('stats', { name: 'cube_count' }, { value: newValue });
        } else {
          // 如果记录不存在，则创建新记录，初始值为 1
          newValue = 1;
          await ctx.database.create('stats', { name: 'cube_count', value: newValue });
        }

        await session.send(`${h.quote(session.messageId)}cube++`);
        cubeLogger.info(`Detected 'cube'. Current count: ${newValue}`);
        
      } catch (e) {
        cubeLogger.error(`Failed to update cube count: ${e}`);
      }
    }

    return next();
  });

  // 3. 添加一个指令，用来查询当前的 cube_count
  ctx.command('cube-cnt', '查询当前统计的 cube 数量')
    .alias(`cube-count`)
    .action(async ({ session }) => {
      try {
        const [stat] = await ctx.database.get('stats', { name: 'cube_count' });
        const count = stat ? stat.value : 0;
        return `${h.quote(session.messageId)}cube = ${count}`;
      } catch (e) {
        cubeLogger.error(`Failed to get cube count: ${e}`);
        return '查询失败，请检查数据库连接。';
      }
    });
}